package com.binhthuan.catechist.server.domain;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import com.google.gson.annotations.Expose;

/**
 * @author Giang Đinh - Thông tin của giáo lý viên, tương ứng với bảng
 *         <b>ec_trainer</b> trong cơ sở dữ liệu.
 */
@Entity
@Table(name="ec_trainer")
@PrimaryKeyJoinColumn(name="person_id")
public class Trainer extends Person {
    
    /**
     * Ngày gia nhập.
     */
    @Column(name="join_date")
    @Expose
    private Date joinDate;

    /**
     * Ngày kính thánh bổn mạng.
     */
    @Column(name="feast_day")
    @Expose
    private Date feastDay;

    /**
     * Email.
     */
    @Column(name="email", length=100)
    @Expose
    private String email;
    
    /**
     * Ghi chú.
     */
    @Column(name="comment", length=255)
    @Expose
    private String comment;
    
    /**
     * Tình trạng hiện tại.
     */
    @ManyToOne
    @JoinColumn(name="trainer_status_id")
    @Expose
    private TrainerStatus status;
    
    /**
     * Lớp dạy hiện tại.
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="current_course_id")
    @Expose
    private Course currentCourse;
    
    /**
     * Tài khoản đăng nhập.
     */
    @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    @PrimaryKeyJoinColumn(name="trainer_id", referencedColumnName="trainer_id")
    @Expose
    private Account account;
    
    /**
     * Các chức danh.
     */
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="ec_trainers_roles",
            joinColumns={ @JoinColumn(name="trainer_id") },
            inverseJoinColumns={ @JoinColumn(name="role_id") })
    private Set<Role> roles;

    /**
     * Các lớp đã phụ trách.
     */
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "trainers", fetch = FetchType.EAGER)
    private Set<Course> courses;

    public Trainer() {
        roles = new HashSet<Role>(0);
    }
    
    /**
     * Lấy ngày gia nhập.
     * @return Ngày gia nhập.
     */
    public Date getJoinDate() {
        return joinDate;
    }

    /**
     * Gán ngày gia nhập.
     * @param joinDate
     *            Ngày gia nhập.
     */
    public void setJoinDate(Date joinDate) {
        this.joinDate = joinDate;
    }

    /**
     * Lấy ngày kính thánh bổn mạng.
     * @return Ngày kính thánh bổn mạng.
     */
    public Date getFeastDay() {
        return feastDay;
    }

    /**
     * Gán ngày kính thánh bổn mạng.
     * @param feastDay
     *            Ngày kính thánh bổn mạng.
     */
    public void setFeastDay(Date feastDay) {
        this.feastDay = feastDay;
    }

    /**
     * Lấy email.
     * @return Email.
     */
    public String getEmail() {
        return email;
    }

    /**
     * Gán email.
     * @param email
     *            Email
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * Lấy ghi chú.
     * @return Ghi chú.
     */
    public String getComment() {
        return comment;
    }

    /**
     * Gán ghi chú.
     * @param comment
     *            Ghi chú.
     */
    public void setComment(String comment) {
        this.comment = comment;
    }

    /**
     * Lấy tình trạng hiện tại.
     * @return Tình trạng hiện tại.
     */
    public TrainerStatus getStatus() {
        return status;
    }

    /**
     * Gán tình trạng.
     * @param status
     *            Tình trạng.
     */
    public void setStatus(TrainerStatus status) {
        this.status = status;
    }

    /**
     * Lấy tài khoản đăng nhập.
     * @return Tài khoản đăng nhập.
     */
    public Account getAccount() {
        return account;
    }

    /**
     * Gán tài khoản đăng nhập.
     * @param account
     *            Tài khoản đăng nhập.
     */
    public void setAccount(Account account) {
        this.account = account;
    }

    /**
     * Lấy các chức danh.
     * @return Các chúc danh.
     */
    public Set<Role> getRoles() {
        return roles;
    }

    /**
     * Gán chức danh.
     * @param roles 
     *            Các chức danh.
     */
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    /**
     * Lấy lớp đang dạy.
     * @return Lớp đang phụ trách.
     */
    public Course getCurrentCourse() {
        return currentCourse;
    }

    /**
     * Gán lớp đang phụ trách.
     * @param currentCourse 
     *            Lớp đang phụ trách.
     */
    public void setCurrentCourse(Course currentCourse) {
        this.currentCourse = currentCourse;
    }

    /**
     * @return the courses
     */
    public Set<Course> getCourses() {
        return courses;
    }

    /**
     * @param courses the courses to set
     */
    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }
}
